(function(winddow){
    "use strict";
    var JTem={};
    JTem.default={};
    JTem.default.rule=/{{[ \t]*([@#]?)(\/?)([\w\W]*?)[ \t]*}}/g;
    JTem.render=function(data,tem,root){                     
        root.innerHTML=JTem.parseHTML(tem,data);             
    };

    
    /**
     * 0.2 
     * 
     */
    JTem.parseHTML=function(tem,data){
        var cursor=0;
        var reExp=JTem.default.rule;
        var match=null;
        var $out="var $out='';\n"; 
        $out+=JTem.getAllParmsByData(data);//初始化所有变量
        while((match=reExp.exec(tem))!==null){
             // 开始标签  {{ 前的内容和结束标签 }} 后的内容 
            $out+=parsehtml(tem.slice(cursor, match.index))
            // 开始标签  {{ 和 结束标签 }} 之间的内容
            // 每一次匹配完成移动指针
            $out+=parsejs(match[3]);
            cursor = match.index + match[0].length;
        }
         parsehtml(tem.substr(cursor, tem.length - cursor));
         $out += 'return $out;';

         function parsehtml(line) {           
             // 单双引号转义，换行符替换为空格,去掉前后的空格
             line = line.replace(/('|")/g, '\\$1').replace(/\n/g, ' ').replace(/(^\s+)|(\s+$)/g,"");
             return '$out+="' + line + '";\n';
         }            
         function parsejs(line) {
             var ss=/(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g;

            return  line.match(ss)? line + '\n' : '$out+=' + line + ';\n';
         } 
         console.log($out);
         
         return new Function($out.replace(/[\r\t\n]/g, '')).apply(data);         
    }

    JTem.getAllParmsByData=function(data){
        var $out="";
        for (var key in data) {
            $out+="var "+key+"=this."+key+";";
        }
        return $out;
    }
     
    JTem.renderByUrl=function(data,temUrl){  

    }
    
    winddow.JTem=JTem;
})(window)